#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
	// malloc的返回值是一个 void * 隐式强转成任何类型的指针都没有警告
	// 但是一般我们都写成 显式强转 目的是增强代码的可读性
	int *p = (int *)malloc(sizeof(int));
	if(NULL == p){ // 一般我们都要对malloc函数的返回值做非NULL检查
		printf("内存分配失败\n");
		return -1;
	}
	printf("分配的空间的首地址是 : %p\n", p);
	// 分配成功后 可以通过指针 访问分配的内存空间
	*p = 100; // 写操作
	printf("*p = %d\n", *p); // 读操作

	free(p);
	printf("free后p中的值 %p\n", p);
	// 注意 free 只是将内存空间的使用权归还给操作系统了
	// 但是 p 中还保存着 内存空间的首地址呢 此时p是一个野指针
	// *p = 1234; // 对p取*操作结果 不可预知
	// 所以一般 为了防止野指针的影响 free 后 需要手动将 p 置 NULL 
	p = NULL;

	return 0;
}
